package com.ims.bookmark;

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;


public class BookMarks {

    /**
     * 保存Word文件中定义的标签
     **/
    private HashMap<String, BookMark> _bookmarks = null;

    /**
     * 构造函数，解析出文档所有的标签
     *
     * @param document Word OOXML document instance.
     */
    public BookMarks(XWPFDocument document) {
        //初始化标签缓存
        this._bookmarks = new HashMap<String, BookMark>();
        // 首先解析文档普通段落中的标签
        this.procParaList(document.getParagraphs());
        // 然后解析表格中的书签
        List<XWPFTable> tableList = document.getTables();
        for (XWPFTable table : tableList) {
            //行
            List<XWPFTableRow> rowList = table.getRows();
            for (XWPFTableRow row : rowList) {
                //单元格
                List<XWPFTableCell> cellList = row.getTableCells();
                for (XWPFTableCell cell : cellList) {
                    //解析单元格中的书签
                    this.procParaList(cell);
                }
            }
        }
    }


    /**
     * 根据标签名称，获得标签的相关定义，如果不存在，则返回空
     *
     * @param bookmarkName 标签名称
     * @return 返回封装好的对象
     */
    public BookMark getBookmark(String bookmarkName) {
        BookMark bookmark = null;
        if (this._bookmarks.containsKey(bookmarkName)) {
            bookmark = this._bookmarks.get(bookmarkName);
        }
        return bookmark;
    }

    /**
     * 得到所有的标签信息集合
     *
     * @return 缓存的标签信息集合
     */
    public Collection<BookMark> getBookmarkList() {
        return (this._bookmarks.values());
    }

    /**
     * 返回文档中的标签名称迭代器
     *
     * @return 由Map KEY 转换的迭代器
     */
    public Iterator<String> getNameIterator() {
        return (this._bookmarks.keySet().iterator());
    }


    /**
     * 解析普通段落中的标签
     *
     * @param paragraphList 传入的段落
     */
    private void procParaList(List<XWPFParagraph> paragraphList) {
        for (XWPFParagraph paragraph : paragraphList) {
            //得到段落中的标签标记
            List<CTBookmark> bookmarkList = paragraph.getCTP().getBookmarkStartList();
            for (CTBookmark bookmark : bookmarkList) {
                System.out.println(bookmark.getName());
                this._bookmarks.put(bookmark.getName(), new BookMark(bookmark, paragraph));
            }
        }
    }

    /**
     * 解析单元格中的书签
     *
     * @param cell
     */
    private void procParaList(XWPFTableCell cell) {
        //得到单元格中的段落
        List<XWPFParagraph> paragraphList = cell.getParagraphs();
        for (XWPFParagraph paragraph : paragraphList) {
            //得到段落中的标签标记
            List<CTBookmark> bookmarkList = paragraph.getCTP().getBookmarkStartList();
            for (CTBookmark bookmark : bookmarkList) {
                System.out.println(bookmark.getName());
                this._bookmarks.put(bookmark.getName(), new BookMark(bookmark, paragraph, cell));
            }
        }
    }

}
